package is1;

import java.util.ArrayList;

/**
 * 	Clase que almacena y gestiona un conjunto de catalogos.
 * Es Singleton
 * @author Abel_Administrador
 *
 */
public class Catalogos 
{
	private static Catalogos unicoCatalogos = null;
	private ArrayList<Catalogo> catalogos;
	private int tamCache ;
	private Catalogos()
	{
		catalogos = new ArrayList<Catalogo>();
		tamCache = 100;
	}
	/**
	 * 	Patron Singleton
	 * @return Unica instancia de Catalogos
	 */
	public static Catalogos getInstance()
	{
		if (unicoCatalogos == null)
		{
			unicoCatalogos = new Catalogos();
		}
		
		return unicoCatalogos;
	}
	
	/**
	 * 	Agrega el catalogo a su lista  
	 * @param c Catalogo
	 */
	public void addCatalogo(Catalogo c)
	{
		catalogos.add(c);
	}
	
	

	/**
	 * 	La cache de datos inicial
	 * @param tam	Tamano de la cache
	 * @throws Exception El tamano no puede ser cero o negativo
	 */
	public void setTamCache(int tam) throws ExcepcionTPV
	{
 
		if(tam > 0)
			tamCache = tam;
		else
			throw new ExcepcionTPV("Tamano de cache incorrecto");
	}
	
	/**
	 * 	Carga los datos de todos los catalogos en funcion
	 * de la cache general establecida
	 */
	public void cargarDatos()
	{
		int t;
		if(catalogos.size() > 0)
		{
			t = tamCache / catalogos.size();
			t = Math.max(1, t);	//Para que nunca de 0 y falle
			for(Catalogo c : catalogos)
			{
				try 
				{
					c.setTamCache(t);
				} catch (Exception e) {} //Nunca va a ser menor que 0
				
				c.cargarDatos();
			}
		}
	}
		
	/**
	 * 	Busca un producto en todos sus catalogos	
	 * @param codProducto Codigo del producto a buscar
	 * @return null si no existe el producto
	 */
	public Producto getProducto(String codProducto)
	{
		Producto buscado = null;
		
		for(Catalogo c : catalogos)
		{
			buscado = c.getProducto(codProducto);
			if(buscado != null)
				break;
		}
		return buscado;
	}
	/**
	 * @param args
	 */
	public static void main(String[] args)
	{
		Catalogos cat = Catalogos.getInstance();
		Catalogo c = new CatalogoCVS("http://www.dlsi.ua.es/~ccachero/catalogo.csv");
		
		cat.addCatalogo(c);
		try {
			cat.setTamCache(10);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		cat.cargarDatos(); 
		
		System.out.println(cat.getProducto("Ref. 001668 "));//En memoria
		System.out.println(cat.getProducto("Ref. 008887 ")); //En el servidor
		System.out.println(cat.getProducto("Ref. 002051 ")); //En el servidor
		System.out.println(cat.getProducto("Ref. 11 ")); //no existe
		System.out.println(cat.getProducto("Ref. 002051 ")); //En el servidor
	}

}
